package com.linftech.demo.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.List;

/**
 * Created by cofey on 2017/3/4.
 */
abstract class AbstractBaseRepository<T> {
    @Autowired
    protected MongoTemplate mongoTemplate;

    /**
     * 插入文档对象
     *
     * @param clazz
     */
    public void insert(T clazz) {
        mongoTemplate.insert(clazz);
    }

    /**
     * 根据主键删除
     *
     * @param id
     * @param collectionName
     */
    public void removeById(String id, String collectionName) {
        mongoTemplate.remove(new Query(Criteria.where("id").is(id)), collectionName);
    }

    /**
     * 分页查询
     *
     * @param query          查询条件
     * @param sort           排序
     * @param pageSize       每页{0}条
     * @param pageNumber     当前{0}页
     * @param clazz          文档对象
     * @param collectionName 文档名称
     * @return
     */
    public Page<T> findPage(Query query, Sort sort, int pageSize, int pageNumber, Class<T> clazz, String collectionName) {
        long count = this.mongoTemplate.count(query, collectionName);
        if (count > 0) {
            PageRequest request = new PageRequest(pageNumber, pageSize);
            query.with(sort);
            query.skip((pageNumber - 1) * pageSize).limit(pageSize);
            List<T> content = this.mongoTemplate.find(query, clazz, collectionName);
            return new PageImpl<T>(content, request, count);
        }
        return new PageImpl<T>(null, null, count);
    }

    /**
     * 分页查询
     *
     * @param query      查询条件
     * @param sort       排序
     * @param pageSize   每页{0}条
     * @param pageNumber 当前{0}页
     * @param clazz      文档对象
     * @return
     */
    public Page<T> findPage(Query query, Sort sort, int pageSize, int pageNumber, Class<T> clazz) {
        long count = this.mongoTemplate.count(query, clazz);
        if (count > 0) {
            PageRequest request = new PageRequest(pageNumber, pageSize);
            query.with(sort);
            query.skip(pageNumber * pageSize).limit(pageSize);
            List<T> content = this.mongoTemplate.find(query, clazz);
            return new PageImpl<T>(content, request, count);
        }
        return new PageImpl<T>(null, null, count);
    }

    /**
     * 根据条件查询列表
     *
     * @param query 查询条件
     * @param clazz 文档对象
     * @return
     */
    public List<T> findList(Query query, Class<T> clazz) {
        return this.mongoTemplate.find(query, clazz);
    }

    /**
     * 根据条件查询列表
     *
     * @param query          查询条件
     * @param collectionName 文档名称
     * @return
     */
    public List<T> findList(Query query, Class<T> clazz, String collectionName) {
        return this.mongoTemplate.find(query, clazz, collectionName);
    }
}
